From f8e32a93e59c9aa8dcfb1e0b41ecfd552fd8e232 Mon Sep 17 00:00:00 2001 From: "mwilli2@equilibrium.research" Date: Thu, 21 Oct 2004 01:11:34 +0000 Subject: [PATCH] bitkeeper revision 1.1159.1.247 (41770cc6Kk3qrDm03nejgR15F8G8Ng) Full balloon driver support for 2.6, including control interface and plumbing into xend / xm. --- .../drivers/xen/balloon/balloon.c | 6 +++--- tools/python/xen/lowlevel/xu/xu.c | 8 ++++++++ tools/python/xen/xend/XendClient.py | 6 ++++++ tools/python/xen/xend/XendDomain.py | 4 ++++ tools/python/xen/xend/server/SrvDaemon.py | 10 ++++++++++ tools/python/xen/xend/server/SrvDomain.py | 9 ++++++++- tools/python/xen/xend/server/domain.py | 7 +++++++ tools/python/xen/xend/server/messages.py | 13 ++++++++++++ tools/python/xen/xm/main.py | 18 +++++++++++++++++ .../hypervisor-ifs/io/domain_controller.h | 20 +++++++++++++++++++ 10 files changed, 97 insertions(+), 4 deletions(-) diff --git a/linux-2.6.8.1-xen-sparse/drivers/xen/balloon/balloon.c b/linux-2.6.8.1-xen-sparse/drivers/xen/balloon/balloon.c index fda84b3590..47b7c796ec 100644 --- a/linux-2.6.8.1-xen-sparse/drivers/xen/balloon/balloon.c +++ b/linux-2.6.8.1-xen-sparse/drivers/xen/balloon/balloon.c @@ -521,7 +521,7 @@ static int __init balloon_init(void) { printk(KERN_ALERT "Starting Xen Balloon driver\n"); - most_seen_pages = current_pages = min(start_info.nr_pages,max_pfn); + most_seen_pages = current_pages = min(xen_start_info.nr_pages,max_pfn); if ( (balloon_pde = create_xen_proc_entry("memory_target", 0644)) == NULL ) { printk(KERN_ALERT "Unable to create balloon driver proc entry!"); @@ -538,14 +538,14 @@ static int __init balloon_init(void) /* * make_module a new phys map if mem= says xen can give us memory to grow */ - if ( max_pfn > start_info.nr_pages ) + if ( max_pfn > xen_start_info.nr_pages ) { extern unsigned long *phys_to_machine_mapping; unsigned long *newmap; newmap = (unsigned long *)vmalloc(max_pfn * sizeof(unsigned long)); memset(newmap, ~0, max_pfn * sizeof(unsigned long)); memcpy(newmap, phys_to_machine_mapping, - start_info.nr_pages * sizeof(unsigned long)); + xen_start_info.nr_pages * sizeof(unsigned long)); phys_to_machine_mapping = newmap; } diff --git a/tools/python/xen/lowlevel/xu/xu.c b/tools/python/xen/lowlevel/xu/xu.c index 9267d65967..db3aa1d5d4 100644 --- a/tools/python/xen/lowlevel/xu/xu.c +++ b/tools/python/xen/lowlevel/xu/xu.c @@ -479,6 +479,10 @@ static PyObject *xu_message_get_payload(PyObject *self, PyObject *args) case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DRIVER_STATUS): C2P(netif_be_driver_status_t, status, Int, Long); return dict; + case TYPE(CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET): + C2P(mem_request_t, target, Int, Long); + C2P(mem_request_t, status, Int, Long); + return dict; } return PyString_FromStringAndSize(xum->msg.msg, xum->msg.length); @@ -640,6 +644,10 @@ static PyObject *xu_message_new(PyObject *self, PyObject *args) P2C(netif_fe_driver_status_t, status, u32); P2C(netif_fe_driver_status_t, max_handle, u32); break; + case TYPE(CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET): + P2C(mem_request_t, target, u32); + P2C(mem_request_t, status, u32); + break; } if ( dict_items_parsed != PyDict_Size(payload) ) diff --git a/tools/python/xen/xend/XendClient.py b/tools/python/xen/xend/XendClient.py index 4ebb6acbea..13a2d63b52 100644 --- a/tools/python/xen/xend/XendClient.py +++ b/tools/python/xen/xend/XendClient.py @@ -350,6 +350,12 @@ class Xend: {'op' : 'inject', 'event' : fileof(sxpr) }) + def xend_domain_mem_target_set(self, id, mem_target): + val = self.xendPost(self.domainurl(id), + {'op' : 'mem_target_set', + 'target' : mem_target }) + return val + def getAsynchXendClientProtocol(): """Load AsynchXendClientProtocol on demand to avoid the cost. """ diff --git a/tools/python/xen/xend/XendDomain.py b/tools/python/xen/xend/XendDomain.py index 5532d5b98f..e79357e82f 100644 --- a/tools/python/xen/xend/XendDomain.py +++ b/tools/python/xen/xend/XendDomain.py @@ -811,6 +811,10 @@ class XendDomain: except Exception, ex: raise XendError(str(ex)) + def domain_mem_target_set(self, id, target): + return xend.domain_mem_target_set(id, target) + + def instance(): """Singleton constructor. Use this instead of the class constructor. diff --git a/tools/python/xen/xend/server/SrvDaemon.py b/tools/python/xen/xend/server/SrvDaemon.py index f3f72b3dd4..c6c4282eee 100644 --- a/tools/python/xen/xend/server/SrvDaemon.py +++ b/tools/python/xen/xend/server/SrvDaemon.py @@ -706,6 +706,16 @@ class Daemon: raise XendError('No domain controller: %s' % dom) ctrl.shutdown(reason) return 0 + + def domain_mem_target_set(self, dom, target): + """Set memory target for a domain. + """ + dom = int(dom) + ctrl = self.domainCF.getController(dom) + if not ctrl: + raise XendError('No domain controller: %s' % dom) + ctrl.mem_target_set(target) + return 0 def instance(): global inst diff --git a/tools/python/xen/xend/server/SrvDomain.py b/tools/python/xen/xend/server/SrvDomain.py index a0ec17526f..ef3b64c8d0 100644 --- a/tools/python/xen/xend/server/SrvDomain.py +++ b/tools/python/xen/xend/server/SrvDomain.py @@ -194,12 +194,19 @@ class SrvDomain(SrvDir): val = fn(req.args, {'dom': self.dom.id}) return val + def op_mem_target_set(self, op, req): + fn = FormFn(self.xd.domain_mem_target_set, + [['dom', 'str'], + ['target', 'int']]) + val = fn(req.args, {'dom': self.dom.id}) + return val + def render_POST(self, req): return self.perform(req) def render_GET(self, req): op = req.args.get('op') - if op and op[0] in ['vifs', 'vif', 'vbds', 'vbd']: + if op and op[0] in ['vifs', 'vif', 'vbds', 'vbd', 'mem_target_set']: return self.perform(req) if self.use_sxp(req): req.setHeader("Content-Type", sxp.mime_type) diff --git a/tools/python/xen/xend/server/domain.py b/tools/python/xen/xend/server/domain.py index 5ed26c7ca2..4e1baf64de 100644 --- a/tools/python/xen/xend/server/domain.py +++ b/tools/python/xen/xend/server/domain.py @@ -33,6 +33,7 @@ class DomainController(controller.Controller): def __init__(self, factory, dom): controller.Controller.__init__(self, factory, dom) self.addMethod(CMSG_SHUTDOWN, 0, None) + self.addMethod(CMSG_MEM_REQUEST, 0, None) self.registerChannel() def shutdown(self, reason): @@ -45,3 +46,9 @@ class DomainController(controller.Controller): raise XendError('invalid reason:' + reason) msg = packMsg(msgtype, {}) self.writeRequest(msg) + + def mem_target_set(self, target): + """Set domain memory target in pages. + """ + msg = packMsg('mem_request_t', { 'target' : target * (1 << 8)} ) + self.writeRequest(msg) diff --git a/tools/python/xen/xend/server/messages.py b/tools/python/xen/xend/server/messages.py index da4980fc96..081dd9ce32 100644 --- a/tools/python/xen/xend/server/messages.py +++ b/tools/python/xen/xend/server/messages.py @@ -216,7 +216,20 @@ shutdown_formats = { msg_formats.update(shutdown_formats) #============================================================================ +# Domain memory reservation message. +#============================================================================ + +CMSG_MEM_REQUEST = 7 +CMSG_MEM_REQUEST_SET = 0 + +mem_request_formats = { + 'mem_request_t': + (CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET) + } + +msg_formats.update(mem_request_formats) +#============================================================================ class Msg: pass diff --git a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py index 797be02ae3..82acffddc5 100644 --- a/tools/python/xen/xm/main.py +++ b/tools/python/xen/xm/main.py @@ -466,6 +466,24 @@ class ProgMaxmem(Prog): xm.prog(ProgMaxmem) +class ProgBalloon(Prog): + group = 'domain' + name = 'balloon' + info = """Set the domain's memory footprint using the balloon driver.""" + + def help(self, args): + print args[0], "DOM MEMORY_TARGET" + print """\nRequest domain DOM to adjust its memory footprint to +MEMORY_TARGET megabytes""" + + def main(self, args): + if len(args) != 3: self.err("%s: Invalid argument(s)" % args[0]) + dom = args[1] + mem_target = int(args[2]) + server.xend_domain_mem_target_set(dom, mem_target) + +xm.prog(ProgBalloon) + class ProgDomid(Prog): group = 'domain' name = 'domid' diff --git a/xen/include/hypervisor-ifs/io/domain_controller.h b/xen/include/hypervisor-ifs/io/domain_controller.h index b660987f0d..ab04072fe8 100644 --- a/xen/include/hypervisor-ifs/io/domain_controller.h +++ b/xen/include/hypervisor-ifs/io/domain_controller.h @@ -53,6 +53,7 @@ typedef struct { #define CMSG_NETIF_BE 3 /* Network-device backend */ #define CMSG_NETIF_FE 4 /* Network-device frontend */ #define CMSG_SHUTDOWN 6 /* Shutdown messages */ +#define CMSG_MEM_REQUEST 7 /* Memory reservation reqs */ /****************************************************************************** @@ -555,4 +556,23 @@ typedef struct { #define CMSG_SHUTDOWN_SUSPEND 2 /* Create suspend info, then */ /* SHUTDOWN_suspend. */ + +/****************************************************************************** + * MEMORY CONTROLS + */ + +#define CMSG_MEM_REQUEST_SET 0 /* Request a domain to set its mem footprint. */ + +/* + * CMSG_MEM_REQUEST: + * Request that the domain change its memory reservation. + */ +typedef struct { + /* OUT */ + u32 target; /* 0: Target memory reservation in pages. */ + /* IN */ + u32 status; /* 4: Return code indicates success or failure. */ +} PACKED mem_request_t; /* 8 bytes */ + + #endif /* __DOMAIN_CONTROLLER_H__ */ -- 2.30.2